// import { ResizeObserver } from 'resize-observer-polyfill'
import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/modules/user'
import router from '../routers'
import { ResponseDto } from './types'
import { ref } from 'vue'
// 创建axios实例 进行基本参数配置
const service = axios.create({
  // 默认请求地址，根据环境的不同可在.env 文件中进行修改
  // baseURL: import.meta.env.VITE_BASE_API_URL,
  baseURL: "http://inv.yuyimed.net:8999",
  // 设置接口访问超时时间
  timeout: 3000000, // request timeout，
  // 跨域时候允许携带凭证
  withCredentials: false,
})

//  request interceptor 接口请求拦截
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    /**
     * 用户登录之后获取服务端返回的token,后面每次请求都在请求头中带上token进行JWT校验
     * token 存储在本地储存中（storage）、vuex、pinia
     */
    const userStore = useUserStore()
    let token: string = userStore.token
    if (!token) {
      token = localStorage.getItem('Admin-Token')
    }
    config.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
    // 自定义请求头
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  (error: AxiosError) => {
    // 请求错误，这里可以用全局提示框进行提示
    return Promise.reject(error)
  },
)

let headers = ref()
//  response interceptor 接口响应拦截
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 直接返回res，当然你也可以只返回res.data
    // 系统如果有自定义code也可以在这里处理
    if (response.status === 200) {
      headers.value = response.headers['content-disposition']
      // console.log(headers);
      return Promise.resolve(response.data.data)
    } else {
      return Promise.reject(response)
    }
  },
  (error: AxiosError) => {
    // return Promise.reject(error)
    const userStore = useUserStore()
    if (error.response.status) {
      console.log(router)
      switch (error.response.status) {
        // 401: 未登录
        case 401:
          userStore.cleanCatch()
          setTimeout(() => {
            router.push({ path: '/login' })
          }, 1000)
          break
        case 403:
          // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.push({
              path: '/',
            })
          }, 1000)
          break

        // 404请求不存在
        case 404:
          break
      }
      return Promise.reject(error.response)
    }
  },
)
export { headers }

/**
 * @description 显示错误消息
 * opt 传入参数
 * err 错误信息
 * type 消息类型
 * duration 消息持续时间
 */
function showErrMessage(opt, err, type: any = 'error', duration: number = 5000) {
  ElMessage({
    message: err.msg,
    type: type,
    duration: duration,
  })
}

// export default service

// 通过导出自定的request实例，来实现对axios的类型封装
export default <T = any>(config: AxiosRequestConfig) => {
  return service(config).then((res) => {
    return res as T
  })
}
